//导入axios库
import axios from "axios"
//导入config.ts文件
import config from "@/config"
//导入消息框
import { ElMessage } from 'element-plus'
//导入token状态
import { useToken } from "@/stores/token"
//导入路由函数
import router from "@/router"


//执行方法得tokenStore对象
const tokenStore = useToken()


//获得config.ts文件导出的baseURL值
const baseURL = config.baseURL;

//创建axios对象
//注：通过相对路径设置axios请求地址时，baseURL将作为请求地址的前缀
const service = axios.create({ baseURL })


//request对象拦截器：用于处理axios请求对象
service.interceptors.request.use(
    //请求成功
    (config)=>{
        const token = tokenStore.token
        if(token){
            config.headers.jwt = token
        }
        return config
    },
    //请求失败
    (error)=>{
        //将错误向上抛，不做任何处理
        return Promise.reject(error)
    }
)

//response对象拦截器：用于处理axios响应对象
service.interceptors.response.use(
    //响应成功
    (response)=>{
        //用户未登录或登录已过期
        if(response.data.errno == 2){
            //提示错误信息
            ElMessage.error(response.data.errmsg)
            //跳转到登录页面
            router.push("/login")
        }
        //返回响应对象
        return response
    },
    //响应失败
    (_error)=>{
        //通过消息框提示错误信息
        ElMessage({type:"error", message:"网络请求失败..."})
        /**
         * 通过ElMessage消息框已经处理了错误，所以就返回一个正确的结果，只是一个空对象，
         * 这个空对象返回给了xxx.vue中axios调用时的接收结果
         */
        return Promise.resolve({})
    }
)

//导出创建的axios对象
export default service